Міністерство освіти та науки України
НУ „Львівська політехніка”
Лекція №11
з курсу: «Застосування засобів об’єктно-орієнтованого програмування в лінгвістичних задачах»
Львів - 2010
Розділ 9. Символьні типи даних.
Символьні дані можуть зберігати текст, наприклад, для виводу на
екран або у вікно діалогу. Символьні дані – це простий ланцюжок з чисел.
Кожне число – це порядковий номер символу в таблиці символів.
Наприклад, якщо представити наш алфавіт у вигляді таблиці символів
(тільки представити), то число 0 означатиме букву А, число 1 означатиме
букву Б, і так далі.
У Delphi використовується 8-бітова розширена таблиця символів, де
задіяні всі 8 бітів (ASCII - American Standard Code for Information
Interchange – таблиця, 0-255 символів). Ця таблиця береться з самої
операційної системи - Windows. Отже кількість символів і їх розташування
залежить від ОС. Для того, щоб задовольнити всі національності, вже
давно ввели підтримку UNICODE (16-бітова таблиця, 65536 символів). У
ній перші 8 біт співпадають з таблицею ANSI, а інші є специфічними.
Починаючи з Windows 2000, це кодування починає використовуватися
все ширше і ширше.
Рис. 1.1. Розкладка UNICODe кодування для BMP-Basic Multilingual Plane
(Plane 0)
У Delphi присутні наступні основні типи символів і стрічок:
ASCIIU+0000LatinGreekCyrillicHebrewArabicIndicThaiFuture usePunctuationSymbolsU+FFFFKanaOther CJKIdeographsHangulSurrogatesPrivate useCompatibility
Тип
Максимальна
довжина рядка
Пам'ять що
відводиться для
збереження рядка
Примітка
AnsiChar
1 байт
ANSI
WideChar
2 байт
UNICODE
Char
1 байт
Родовий символьний
тип
ShortString
255 символів
Від 2 до 256 байт
AnsiString
231
Від 4 байтів до
2 Гбайт
8 бітові
WideString
230
Від 4 байтів до
2 Гбайт
UNICODE
( вказівних типа Pointer, Pchar , Text )
В ShortString – стрічках текуча довжина вказується в нульовому
(індекс нуль) елементі стрічки. В цьому елементі записується символ, код
якого дорівнює значенню текучої довжини. Нульовий елемент стрічки при
цьому зроблений невидимим для користувача. Оскільки кожен символ
займає один байт пам’яті, то при такому способі способі вказання довжини,
максимально допустима довжина стрічки буде обмежена максимальним
значенням, яке можна записати в один байт пам’яті, не більше 255
символів.
n – фіксована загальна довжина стрічки;
p – текуча довжина стрічки.
var
Smax2: ShortString;
На відміну від ShortString – стрічок, пам’ять під довгі стрічки
AnsiString виділяються не статично а динамічно. Крім того, AnsiString –
стрічка не має максимальної довжини, що встановлюеться при оголошенні,
а тільки динамічну текучу довжину. Спільним для обох типів стрічок є
наявність дескриптора. Однак якщо для коротких стрічок дескриптор має
простий вид додаткового нульового елемента, в якому зберігається текуча
довжина стрічки, то у довгих стрічок дескриптор предсталяє собою більш
складну структуру довжиною 8 байтів яка має наступний вид:
012345111012761398BADRLNOСимвол, код якого дорівнює 7.14p = 7n = 14
Текуча довжина стрічки(4 байта)
Лічильник посилань на стрічку(4 байта)
Змінна типу AnsiString представляє собою 4-х байтовий вказівник на
дескриптор наведеної структури, безпосередньо за яким в пам’яті
розмішається символи стрічки. Якщо довжина стрічки має нульову
довжину, то пам’ять під неї і під дескриптор не виділяється, а відповідна
змінна має значення nil.
Внутрішня будова довгої стрічки в пам’яті можна представити як
представлено на малюнку.
var
LongStr1, LongStr2: AnsiString;
// Після обробки оголошення значення вказівника на стрічку
// AnsiString встановлюється в nil
begin
LongStr1 := ’Дуже довга стрічка ..........Дуже довга стрічка’;
// Після такого присвоення структура стрічки AnsiString буде мати
//наступний вигляд
Рис. Внутрішня будова довгої стрічки в пам’яті
Стрічки типу AnsiString мають ще одну особливість, яка пов’язана з
лічильником посилань на стрічку, що входять ...